QML进阶(八)实现QML界面与C++类型交互 | 您所在的位置:网站首页 › qml 数据类型 › QML进阶(八)实现QML界面与C++类型交互 |
在QML工程中,一般QML界面只负责前端交互,而真正的业务逻辑都是C++模块实现的。为了实现前端和后端的顺利衔接,我们需要做好QML界面与C++的交互。这里就介绍一下如何在QML中调用对应的C++模块。在QML中调用C++模块的方法主要有三种,分别是: 1.设置上下文属性(setContextProperty()) 2.在QML引擎里面注册新类型(qmlRegisterType) 3.导出对应的QML扩展插件。 下面介绍一下三个方法的优缺点: 对于小型应用来说,方法一设置上下文属性是最简单实用的方法。开发者只需要将对应的接口和变量暴露给QML就行。由于设置在QML中的变量是全局的,一定要注意避免名称冲突。 在QML引擎里面注册新的类型,允许用户在QML文件中控制C++对象的生命周期,这是设置上下文属性这种方法无法实现的。同时注册新类型的方法,不会污染全局命名空间。但是这种方法也有一个缺点,就是QML中的类型都需要提前注册,所有用到的库都需要在程序启动的时候链接,无法动态链接。但在绝大多数情况下,这并不是一个问题。 QML扩展插件是弹性最好,但也是最复杂的方法。QML允许用户在插件里面注册对应的新类型。这些新类型在QML第一次导入对应的符号的时候被加载。同时,通过使用QML单例引入,我们的新类型不会污染全局命名空间。由于新类型被插件化了,我们可以很轻松的在多个项目中复用我们之前定义的新类型。 下面分别通过实例介绍一下三种方法的调用过程 1.设置上下文属性(setContextProperty())首先在QML工程中添加一个C++类FileIO,该类主要负责文件的打开读取和保存。类继承自QObject,导出了QML需要访问的接口和成员变量,代码如下: 123456789101112131415161718192021222324252627282930313233343536373839404142//fileio.h #ifndef FILEIO_H #define FILEIO_H #include //用来打开的保存对应的文件 class FileIO : public QObject { Q_OBJECT //定义QML可以访问的属性,定义格式如下 //Q_PROPERTY(变量类型 访问名称 READ 读方法 WRITE 写方法 NOTIFY 发生变化的通知信号) //需要定义在Q_OBJECT之后第一个public之前 Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged) Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged) //ui_title是在QML使用的别名,m_title_content是对应的变量名称 //CONSTANT说明是只读的 Q_PROPERTY(QString ui_title MEMBER m_title_content CONSTANT) public: FileIO(QObject *parent = 0); ~FileIO(); //定义QML可以访问的方法 Q_INVOKABLE void read(); Q_INVOKABLE void write(); QUrl source() const; QString text() const; public slots: void setSource(QUrl source); void setText(QString text); signals: void sourceChanged(QUrl arg); void textChanged(QString arg); private: QUrl m_file_source; QString m_file_content; //用来测试的只读title数据 QString m_title_content; }; #endif // FILEIO_H 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667//fileio.cpp #include "fileio.h" FileIO::FileIO(QObject *parent) : QObject(parent), m_title_content(QString("fileio")) { } FileIO::~FileIO() { } void FileIO::read() { if(m_file_source.isEmpty()) { return; } QFile file(m_file_source.toLocalFile()); if(!file.exists()) { qWarning() |
CopyRight 2018-2019 实验室设备网 版权所有 |